"""
文件处理模块，负责输入输出文件的处理
"""
import os
import pandas as pd
from typing import List, Dict, Union, Optional


class FileHandler:
    """文件处理类"""
    
    @staticmethod
    def is_supported_format(file_path: str) -> bool:
        """
        检查文件格式是否支持
        
        Args:
            file_path: 文件路径
            
        Returns:
            是否为支持的格式
        """
        if not os.path.isfile(file_path):
            return False
            
        ext = os.path.splitext(file_path)[1].lower()
        return ext in ['.csv', '.txt']
    
    @staticmethod
    def detect_file_type(file_path: str) -> str:
        """
        检测文件类型
        
        Args:
            file_path: 文件路径
            
        Returns:
            文件类型: 'csv' 或 'txt'
        """
        ext = os.path.splitext(file_path)[1].lower()
        if ext == '.csv':
            return 'csv'
        elif ext == '.txt':
            return 'txt'
        else:
            raise ValueError(f"不支持的文件格式: {ext}")
    
    @staticmethod
    def export_results(df: pd.DataFrame, output_path: str, format_type: str = 'csv') -> str:
        """
        导出解析结果
        
        Args:
            df: 包含解析结果的DataFrame
            output_path: 输出文件路径
            format_type: 输出格式类型, 'csv' 或 'txt'
            
        Returns:
            输出文件的完整路径
        """
        # 确保输出目录存在
        output_dir = os.path.dirname(output_path)
        if output_dir and not os.path.exists(output_dir):
            os.makedirs(output_dir)
        
        if format_type.lower() == 'csv':
            # 导出为CSV
            df.to_csv(output_path, index=False, encoding='utf-8')
        elif format_type.lower() == 'txt':
            # 导出为TXT (只导出原始和解析列)
            with open(output_path, 'w', encoding='utf-8') as f:
                for _, row in df.iterrows():
                    if 'original' in df.columns and 'parsed' in df.columns:
                        f.write(f"原始: {row['original']}\n")
                        f.write(f"解析: {row['parsed']}\n")
                        f.write('-' * 50 + '\n')
                    else:
                        # 尝试找出原始和解析的列
                        parsed_cols = [col for col in df.columns if col.endswith('_parsed')]
                        for parsed_col in parsed_cols:
                            original_col = parsed_col.replace('_parsed', '')
                            f.write(f"原始 ({original_col}): {row[original_col]}\n")
                            f.write(f"解析: {row[parsed_col]}\n")
                            f.write('-' * 50 + '\n')
        else:
            raise ValueError(f"不支持的导出格式: {format_type}")
        
        return output_path
    
    @staticmethod
    def preview_file(file_path: str, max_rows: int = 5) -> pd.DataFrame:
        """
        预览文件内容
        
        Args:
            file_path: 文件路径
            max_rows: 最大预览行数
            
        Returns:
            包含预览数据的DataFrame
        """
        file_type = FileHandler.detect_file_type(file_path)
        
        if file_type == 'csv':
            return pd.read_csv(file_path, nrows=max_rows)
        elif file_type == 'txt':
            with open(file_path, 'r') as f:
                lines = [line.strip() for line in f.readlines()[:max_rows]]
            
            return pd.DataFrame({
                'line': range(1, len(lines) + 1),
                'content': lines
            })
        
        return pd.DataFrame() 